package com.buss.core.persistence;

import java.io.Serializable;
import java.sql.ResultSet;
import java.util.List;
import java.util.Map;

import org.hibernate.SQLQuery;
import org.hibernate.Session;


public interface BaseDao<T extends Serializable> {
	
	public Session getSession();
	
	/**
	 * 执行本地SQL以返回ResultSet对象
	 * @param sql
	 * @param cond
	 * @return
	 */
	public ResultSet getResultSet(String sql,PersistenceCond cond);
	
	/**
	 * 新增实体
	 * @param entity
	 */
	public void save(Object entity);
	
	/**
	 * 修改实体
	 * @param entity
	 */
	public void edit(Object entity);
	
	/**
	 * 新增或修改实体
	 * @param entity
	 * @return
	 */
	public T saveOrEdit(Object entity);

	/**
	 * 批量新增或修改实体
	 * @param entitys
	 */
	public void saveOrEditBatch(List<Object> entitys);
	
	/**
	 * 通过ID删除指定的实体
	 * @param id
	 * @param type
	 */
	@SuppressWarnings("unchecked")
	public void remove(Serializable id,Class type);
	
	/**
	 * 删除指定实体
	 * @param object
	 */
	public void remove(Object object);
	
	/**
	 * 根据ID获取单个对象
	 * @param id
	 * @param type
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T load(Serializable id,Class type);
	
	/**
	 * 根据ID获取单个对象(不支持缓存)
	 * @param id
	 * @param type
	 * @return
	 */
	public T get(Serializable id,Class type);
	
	/**
	 * 根据HSQL查询单个实体信息
	 * @param hsql
	 * @return
	 */
	public T loadHsql(String hsql,PersistenceCond cond);
	
	/**
	 * 根据HSQL查询单个实体信息
	 * @param hsql
	 * @param map
	 * @return
	 */
	public T loadHsql(String hsql,Map<String,Object> map);
	
	/**
	 * 根据本SQL查询单个实体信息
	 * @param sql
	 * @param resultEntity
	 * @param cond
	 * @param page
	 * @return
	 */
	public T loadNative(String sql,Class resultEntity,PersistenceCond cond,Paginalbe page);
	
	/**
	 * 根据本SQL查询单个实体信息
	 * @param sql
	 * @param resultEntity
	 * @param cond
	 * @param page
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T loadNative(String sql,Class resultEntity,Map<String,Object> map,Paginalbe page);
	
	/**
	 * 根据HSQL返回单个值对象(如：总金额，总记录数等等)
	 * @param hsql
	 * @param cond
	 * @return
	 */
	public Object loadSingleValue(String hsql,PersistenceCond cond);
	
	/**
	 * 根据HSQL返回单个值对象(如：总金额，总记录数等等)
	 * @param hsql
	 * @param cond
	 * @return
	 */
	public Object loadSingleValue(String hsql,Map<String,Object> map);
	
	/**
	 * 根据本地SQL返回单个值对象
	 * @param sql
	 * @param cond
	 * @return
	 */
	public Object loadNativeSingleValue(String sql,PersistenceCond cond);
	
	/**
	 * 根据本地SQL返回单个值对象
	 * @param sql
	 * @param map
	 * @return
	 */
	public Object loadNativeSingleValue(String sql,Map<String,Object> map);
	
	/**
	 * 执行HSQL语句进行增加、删除、修改操作
	 * @param hsql
	 * @param cond
	 */
	public void excuteHsql(String hsql,PersistenceCond cond);
	
	/**
	 * 执行HSQL语句进行增加、删除、修改操作
	 * @param hsql
	 * @param map
	 */
	public void excuteHsql(String hsql,Map<String,Object> map);
	
	/**
	 * 执行本地SQL进行增加、删除、修改操作
	 * @param sql
	 * @param cond
	 */
	public void excuteNative(String sql,PersistenceCond cond);
	
	/**
	 * 执行本地SQL进行增加、删除、修改操作
	 * @param sql
	 * @param map
	 */
	public void excuteNative(String sql,Map<String,Object> map);
	
	/**
	 * 根据hsql查询列表信息,使用List
	 * @param hsql
	 * @param cond
	 * @param page
	 * @return
	 */
	public ResultList<T> queryHsql(String hsql,PersistenceCond cond,Paginalbe page);
	
	/**
	 * 根据hsql查询列表信息,使用List
	 * @param hsql
	 * @param map
	 * @param page
	 * @return
	 */
	public ResultList<T> queryHsql(String hsql,Map<String,Object> map,Paginalbe page);
	
	
	/**
	 * 根据hsql查询列表信息,使用Iterator
	 * @param hsql
	 * @param cond
	 * @param page
	 * @return
	 */
	public ResultList<T> queryHsqlByIter(String hsql,PersistenceCond cond,Paginalbe page);
	
	/**
	 * 根据hsql查询列表信息,使用Iterator
	 * @param hsql
	 * @param map
	 * @param page
	 * @return
	 */
	public ResultList<T> queryHsqlByIter(String hsql,Map<String,Object> map,Paginalbe page);
	
	/**
	 * 使用本地sql查询数据并将结果封装到Bean对象中
	 * @param sql	本地sql预计
	 * @param beanNames	sql中字段对应到Bean中的属性名称
	 * @param map	条件参数
	 * @param beanClazz	结果封装到的Bean
	 * @param page	分页对象
	 * @return
	 */
	public ResultList<T> queryNative(String sql,SQLQuery query,Map<String,Object> map, Paginalbe page);
}

